public class TestAdaptee {
    /**
     * @Description 适配器模式主要有三个部分:
     * 目标角色（Target）：也就是我们期望的接口；
     * 源角色（Adapted）：存在于系统中，内容满足客户需求（需转换），但接口不匹配的接口实例；
     * 适配器（Adapter）：将源角色（Adaptee）转化为目标角色（Target）的类实例；
     * <p>
     * 实现方式也有两种：
     * 通过继承实现的类模式
     * 通过组合实现的类模式
     *
     * ---------------------------------------------------------
     * 适配器模式使用场景：(滥用适配器模式对项目来说可能是一场灾难.......)
     *  使用场景：有动机地修改一个正常运行的系统的接口，这时应该考虑使用适配器模式。
     *  注意事项：适配器不是在详细设计时添加的，而是解决正在服役的项目的问题。
     * ---------------------------------------------------------
     *
     *
     * @Date 14:10 2022/8/9
     * @Author sunye
     **/
    public static void main(String[] args) {
        ITarget adapterClass = new AdapterClass();
        adapterClass.request();

        ITarget adapterObject = new AdapterObject();
        adapterObject.request();
    }
}


/**
 * 客户端的接口
 */
interface ITarget {
    void request();
}

/**
 * 想要的目标方法，但并没有实现接口
 */
class Target {
    public void targetRequest() {
        System.out.println("targetRequest 目标方法，最终需要执行的适配方法");
    }
}

/**
 * 源方法，此方法并不满足客户要求，需要进行适配之后工作
 */
class AdaptedImpl implements ITarget {
    @Override
    public void request() {
        System.out.println("AdapteeImpl 目标源 方法，需要进行Target适配");
    }
}

/**
 * 适配器类，通过继承目标类进而对接口类进行实现，完成对目标接口的适配工作
 */
class AdapterClass extends Target implements ITarget {
    @Override
    public void request() {
        System.out.print("通过调用父类的目标方法完成对子类的适配：");
        //通过调用父类的目标方法完成对子类的适配
        super.targetRequest();
    }
}


/**
 * 适配器类，通过组合目标对象进而对接口类进行实现，完成对目标接口的适配工作
 */
class AdapterObject implements ITarget {
    final Target target = new Target();
    @Override
    public void request() {
        System.out.print("通过调用父类的目标方法完成对子类的适配：");
        //通过调用父类的目标方法完成对子类的适配
        target.targetRequest();
    }
}
